package com.mjh.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * 读取和修改xml文件的工具类
 * 
 * @author mojiahui
 * 
 */
public class XMLParser {

	private Document document;

	private Element rootElement;

	private String xmlFile;

	public XMLParser(String xmlFile) {
		try {
			this.xmlFile = xmlFile;
			loadFile(new FileInputStream(this.xmlFile));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 加载xml文件
	 * @param input
	 * @throws DocumentException
	 * @throws FileNotFoundException
	 */
	private void loadFile(InputStream input) throws DocumentException,
			FileNotFoundException {
		SAXReader reader = new SAXReader();
		document = reader.read(input);
		rootElement = document.getRootElement();
	}
	/**
	 * 通过节点的id得到该节点对象
	 * @param id
	 * @return
	 */
	public Element getSingleElementById(String id){
		return (Element)document.selectSingleNode("//*[@id='"+id+"']");
	}
	/**
	 * 在根节点下添加一个子节点
	 * @param elementName
	 * @return
	 */
	public Element appendNodeToRoot(String elementName){
		return rootElement.addElement(elementName);
	}
	/**
	 * 在指定的节点下添加一个子节点
	 * @param fartherElement
	 * @param elementName
	 * @return
	 */
	public Element appendNode(Element parentIdElement, String elementName){
		return parentIdElement.addElement(elementName);
	}
	/**
	 * 在指定id的节点下添加一个子节点
	 * @param parentId
	 * @param elementName
	 * @return
	 */
	public Element appendNodeById(String parentId, String elementName){
		return this.appendNode(this.getSingleElementById(parentId), elementName);
	}
	/**
	 * 设置指定id的节点的属性值
	 * @param elementId
	 * @param attributeName
	 * @param attributeValue
	 */
	public void setAttributeById(String elementId, String attributeName, String attributeValue){
		this.getSingleElementById(elementId).attribute(attributeName).setValue(attributeValue);
	}
	/**
	 * 设置根节点下子节点的属性值，没有id，且每个子节点名称都不一样的情况下使用
	 * 
	 * @param childNodeName
	 * @param attributeName
	 * @param value
	 */
	public void setAttributeValue(String childNodeName, String attributeName,
			String value) {
		rootElement.element(childNodeName).attribute(attributeName).setValue(
				value);
	}
	/**
	 * 设置指定id的节点的文本值
	 * @param elementId
	 * @param text
	 */
	public void setTextById(String elementId, String text){
		this.getSingleElementById(elementId).setText(text);
	}
	/**
	 * 设置根节点下子节点文本值，没有id，且每个子节点名称都不一样的情况下使用
	 * 
	 * @param childNodeName
	 * @param value
	 */
	public void setChildNodeValue(String childNodeName, String value) {
		rootElement.element(childNodeName).setText(value);
	}
	/**
	 * 获取根节点下子节点文本值，没有id，且每个子节点名称都不一样的情况下使用
	 * 
	 * @param childNodeName
	 * @param value
	 */
	public String getChildNodeValue(String childNodeName) {
		return rootElement.element(childNodeName).getText();
	}	
	/**
	 * 删除指定id的节点
	 * @param parentId
	 * @param childId
	 */
	public void removeNode(String childId){
		this.getSingleElementById(childId).getParent().remove(this.getSingleElementById(childId));
	}
	/**
	 * 删除指定id的节点
	 * @param parentId
	 * @param childId
	 */
	public void removeNode(String parentId, String childId){
		this.getSingleElementById(parentId).remove(this.getSingleElementById(childId));
	}
	/**
	 * 删除根节点下的指定id的子节点
	 * @param elementId
	 */
	public void removeNodeFromRoot(String elementId){
		rootElement.remove(this.getSingleElementById(elementId));
	}
	/**
	 * 遍历根节点下的所有子节点
	 * @param elementName
	 * @return
	 */
	public Iterator<Element> listAllNodeFromRoot(){
		return rootElement.elementIterator();
	}
	
	/**
	 * 遍历指定节点下的所有子节点
	 * @param elementName
	 * @return
	 */
	public Iterator<Element> listAllNode(String elementId){
		return this.getSingleElementById(elementId).elementIterator();
	}	
	
	/**
	 * 将修改后的内容写回到xml文件中
	 */
	public void wirteXML() {
		XMLWriter output;
		try {
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("UTF-8");   
			output = new XMLWriter(new FileOutputStream(new File(xmlFile)),format);
			output.write(document);
			output.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		String path = ResourceUtil
				.getRealPath("com/mjh/config/category.xml");
		System.out.println(path);
		XMLParser parser = new XMLParser(path);

		Element el = parser.getSingleElementById("10002");
		//parser.removeNode("10002");
		System.out.println(el.attributeValue("name"));
		//parser.wirteXML();
	}

}
